import requests # requests 是一个简单易用的HTTP库，用于发送网络请求。
from bs4 import BeautifulSoup # BeautifulSoup 是一个用于从HTML或XML文件中提取数据的Python库。
import re # re 模块提供了对正则表达式的支持。
import os # os 模块提供了许多与操作系统交互的功能import json # json 模块允许你编码和解码JSON数据。
import queue # queue 模块实现了同步的、线程交全的副列类
import threading # threading 模块提供了基本的线释和锁的支持。
import time # time 模块提供了各种与时间相关的函数。
# https://ssrl.scrape.center/page/2URL = 'https://ssr1.scrape.centerPAGE = 10PATH ='./moveis’# 定义爬取数据存放的目录if not os.path.exists(PATH):# os.path.exists(PATH):这个数检査PATH指定的路径是否存在os.mkdir(PATH)# os.mkdir(PATH):这个医数用于创建一个新的目录，即文件夹。
URL = 'https://ssr1.scrape.center'
PAGE = 10
PATH ='./moveis'# 定义爬取数据存放的目录if not os.path.exists(PATH):# os.path.exists(PATH):这个数检査PATH指定的路径是否存在os.mkdir(PATH)# os.mkdir(PATH):这个医数用于创建一个新的目录，即文件夹。
if not os.path.exists(PATH):# os.path.exists(PATH):这个数检査PATH指定的路径是否存在
    os.mkdir(PATH)# os.mkdir(PATH):这个医数用于创建一个新的目录，即文件夹
Q = queue.Queue()
def get_a():
    """
    获取所有a标签中的电影链接
    """
    for page in range(1, PAGE + 1):  # 每一页 url 链按f'{URLHpage/{page}
        url = URL + '/page/' + str(page)
    res = requests.get(url)
    res.encoding = res.apparent_encoding  # 这行代码时，它实际上是在做一件很重要的事情:没置响应体的编码方式。
    html = res.text
    soup = BeautifulSoup(html, 'html.parser')#创建Beutifulsoup对象、解折HTML元素、指定解折器:"html.parser'
    atags = soup.findall('a', {'class': 'name' })

    # print(fatagf'href'l for atag in atags])#将电影的比l存入副列中
    for atag in atags:
        Q.put(URL + atag['href'])
def get_content(url):
    """
    获取电影详细信息
    """
    try:
        res = requests.get(url)
        res.encoding = res.apparent_encoding
        html = res.text

        soup = BeautifulSoup(html,'heml.parser')
        title = soup.h2.string
        categories = [span.string for span in soup.find('div', {'class': 'categories'}).findAll('span')]
        info_divs1,info_divs2 = soup.findAll('div',{'class':'info'})
        info_spans1 = info_divs1.findAll('span')
        countries = info_spans1[0].string
        time = info_spans1[-1].string

        published = info_divs2.span.string
        drama = soup.find('div', {'class': 'drama'}).p.string.strip()
        score = soup.find('p', {'class': 'score'}).string.strip()

        dic = {
            'title':title,
            'categories':categories,
            'time':time,
            'published':published,
            'drama':drama,
            'score':score
        }
        return dic
    except Exception as e:
        print(e)
def write_content():
    """
    线程任务函数
    """
    while not Q.empty():
        url = Q.get()
        content_dic = get_content(url)
        with open(os.path.join(PATH, content_dic['title']), 'w', encoding='utf8') as f:
            data = json.dumps(content_dic, ensure_ascii = False)

              # json.dumps西数将字典content dic转换为ISON格式的字符串:
            f.write(data)
def start_thread(thread_names,thread_nums, args=tuple()):
    """
    线程启动函数
    """
    threads = []
    for i in range(thread_nums):
        t = threading.Thread(target=thread_names, args = args)
        t.setDaemon(True)
              # setDaemon 方法是 python 中 threading.Thread 类的一个方法，用于设置线程是否为守护线程(daemon thread)
        t.start()
        threads.append(t)
    alive = True
    while alive:
        alive = False
        for t in threads:
            if t.is_alive():
                alive = True
            time.sleep(0.1)
if __name__ == '__main__':
    get_a()
    start_thread(write_content,5)

get_content('https://ssr1.scrape.center/detail/13')
write_content('https://ssr1.scrape.center/detail/13')




